Hbase备份与恢复
四种方案:
◆Export / Import ◆CopyTable ●Replication ●Snapshot
CopyTable
- 支持时间区间 、row区间,改变表名称, 改变列族名称,指定是否 Copy已经被删除的数据等功能,
- CopyTable工具采用scan查询, 写入新表时采用put和delete API, 全是基于hbase的client Api进行读写
- 在线,前提在目标集群中先建立好同名表
可以在本集群中拷贝一张表,也可以将表拷贝到其他的集群中。
1、利用CoprocessorTest来测试本集群中拷贝一张表
2、先创建一个表
3、执行CopyTable 操作
4、查看此时两表相同
5、如果是跨集群迁移
命令: ./hbase org.apache.hadoop.hbase.mapreduce.CopyTable –peer.adr=dest_cluster:2181:/hbase1
说明:
1)拷贝完成,不需要重启机器,在 new cluster 中就可以看到该表;
2)稳定性还需要考虑,测试过程中遇到一个问题,拷贝过程中始终都停留在这里
Lookedup root region location, 查看日志没有什么错误和相关的信息。
Export/Import
- Export可导出数据到目标集群, 然后可在目标集群Import导入数据, Export支持指定开始时间和结束时间, 因此可以做增量备份.
- Export导出工具与CopyTable一样是依赖hbase的scan读取数据
- (在线,前提在目标集群中比较建立好同名表)
1、执行Export
查看hdfs目录是否有这个文件
2、执行Import
清空表
数据恢复
简要步骤:
1)在 old cluster 上执行:./hbase org.apache.hadoop.hbase.mapreduce.Export test hdfs://new cluster ip:9000/ test
2)在 new cluster 上执行:./hbase org.apache.hadoop.hbase.mapreduce.Import test hdfs://new cluster ip:9000/ test
说明:
1)一定要写全路径,不能写相对路劲;
2)在 import 前,需要将表事先在 new cluster 中创建好
Snapshot
- Snapshot即快照的意思, 作用于表上;通过配置hbase-site.xml开启该功能
- 可以快速的恢复表至快照指定的状态从而迅速的修复数据 (会丢失快照之后的数据)
对于快照操作的shell命令 进入hbase shell
测试列出快照;其他操作略
恢复数据
跨集群操作
1)生成快照:
$ ./bin/hbase shell
hbase> snapshot ‘myTable’, ‘myTableSnapshot-122112’
2)用快照克隆表(这个克隆操作不涉及数据拷贝,在新集群中操作):
$ hbase shell
hbase> clone_snapshot ‘myTableSnapshot-122112’, ‘myNewTestTable’
3)导出到另一集群:
要拷贝一张叫 MySnapshot 的快照到HBase集群srv2(hdfs://dest_cluester:8020/hbase)下,使用16个maptask
$ sudo -u hbase hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://dest_cluester:8020/hbase -mappers 16
说明:这个 ExportSnapshot 工具拷贝了整个快照相关的所有的数据到另一个集群上
Replication
- 可以通过replication机制实现hbase集群的主从模式
- Replication是依赖wal日志进行的同步(Replication必须开启WAL,修改hbase-site.xml)
简要步骤:
1)在 old cluster 将需要迁移的表属性进行修改:
disable ‘your_table’
alter ‘your_table’, {NAME => ‘family_name’, REPLICATION_SCOPE => ‘1’}
enable ‘your_table’
2)打开 new cluster 集群的 replication,修改 hbase-site.xml
3)添加 peer(主节点里添加要复制的从节点的),在 new cluster 的 hbase shell 中执行:add_peer ‘1’,’old cluster ip:2181:/hbase’,启动 replication,执行 start_replication
说明:需要两个集群的 hadoop 版本一致,否则出现读写错误
总结
- CopyTable喝Export/Import这两种方式是基于MapReduce性能不是太高;
- Replication是一种比较常见的方式;本质上利用了endpoint协处理器对WAL日志进行顺序读取来达到备份的目的;
- Snapshot是作用于表上,实际上针对元数据的快照,并不直接备份HFile,所以说它可以快速的将表恢复的快照的状态,从而迅速的进行数据的修复;
DistCp 迁移(需要停掉集群)
1)旧的集群上先 disable alltable:
disable tablename(单张表 disable)
disable_all (整个 hbase 所有表 disable)
同理 enable tablename 以及 enable_all
2)hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hdfs://src_cluster:9000/hbase/tablename
hdfs://dest_cluester:8020/hbase/data/default/tablename
或者使用
hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hftp://src_cluster:50070/hbase/tablename
webhdfs://dest_cluester:50070/hbase/data/default/tablename
或者使用
hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hftp://src_cluster:50070/hbase/tablename
hftp://dest_cluester:50070/hbase/data/default/tablename
使用脚本进行迁移
将所有表名放在一个文件中进行读取:
1 | #!/bin/bash |
注:具体细节需要各自实践进行调整
Kill 所有 DistCp 进程:
jps | grep DistCp | awk ‘{print $1}’ | xargs kill -9
DSTools 修复表操作(针对某平台环境,提供了修复工具):
sh runDSTools.sh tablename (单张表修复)
sh runDSTools.sh 1>&2 2> /tmp/xx.log.1(不加表名即表示整个集群修复,此处为脚本工具,可以参考 hbase 官网数据修复.MATE 修复部分)
DSTools 修复 Hfile 命令(针对某平台环境,提供了修复工具):
sh runHFileCheck.sh tablename 1>&2 2> /tmp/hfilecheck.log.1
sh runHFileCheck.sh -fixReferenceFiles -sidelineCorruptHFiles tablename 1>&2 2> /tmp/hfilecheck.log.2
sh runHFileCheck.sh tablename 1>&2 2> /tmp/hfilecheck.log.3
数据表修复时出现 regionserver 时常死亡时,请修改以下参数(可进行适当的调整)
1)hbase-site.xml 里,配置 hbase.ipc.server.max.callqueue.length 为 10。
2)hbase-env.sh 里,修改配置:
-XX:CMSInitiatingOccupancyFraction=80 ==> -XX:CMSInitiatingOccupancyFraction=70
-XX:NewRatio=3 ==> -XX:NewRatio=4
3)hbase-env.sh 里,regionserver 的 heap size 只允许两种配置:
-Xms24000m -Xmx24000m 或者 -Xms30000m -Xmx30000m
如果机器内存比较充足,可以选后者,否则选前者。
批量删除 hbase 表命令:
1)先将所有 hbase 表的表名列出存在文件 hbase-tmp1 中
for i in echo 'list' | hbase shell
;do echo $i >> /tmp/hbase-tmp1;done
2)打开这个文件删除不相干的信息,只保留表名信息
3)执行批量删除操作
for i in cat /tmp/hbase-tmp1
;do echo "delete_table '$i'" | hbase shell
;done
使用 delete_table 可以直接删除表,不要事先 disable,单张表删除可以使用
delete_table 直接删除或者先 disable tablename 再 drop
将 HDFS 中 hbase 表文件落地再迁移(集群不通)
把某个表(table1)从集群 1 迁移到集群 2(两个集群互相看不见),步骤如下
1)拷贝集群 1 的表文件到本地磁盘 :
/app/cloud/Hadoop/bin/hadoop fs -copyToLocal /hbase/table1 /data0/hbase-backup/table1
2)对于文件操作,很简单吧,随便你怎么去拷贝来拷贝去
3)如果集群 2 中也有对应的表文件,那么删除掉,然后拷贝
/app/cloud/hadoop/bin/hadoop fs -rmr /hbase/tablename
/app/cloud/hadoop/bin/hadoop fs -copyFromLocal /data0/hbase-backup/tablename /hbase/tablename
4)重置该表在.META.表中的分区信息
bin/hbase org.jruby.Main bin/add_table.rb /hbase/tablename
另外:
1)如果表的数据量过大呢? 那么按照该表在 HDFS 中的文件夹数据,分批拷
贝。
2)如果两个集群可以互相通信呢?采用DistCp方案即可
Hbase监控简介
为什么需要监控
- 为了保证系统的稳定性, 可靠性, 可运维性
- 了解集群的性能表现, 及时做出针对性调整
- 集群出现问题及时报警, 帮助运维快速定位与解决问题
如何监控HBase集群
- 利用Hadoop生态圈开源的专业监控工具(Ambari)
- 自己调用Hadoop和HBase的JMX接口获取监测数据
顶级项目: Ambari
- Ambari跟Hadoop等开源软件一样, 是Apache基金会的顶级项目
- 创建 、 管理 、 监视Hadoop的集群 (Hadoop生态圈)
- Ambari就是为了让Hadoop以及相关的大数据软件更容易使用的一个工具
Hadoop JMX监控实战
代码太多已打包上传到资源:https://download.csdn.net/download/bingdianone/10848206
实体类
DataNodeInfo :datanode的一些属性
HdfsSummary :hdfs的属性
工具类
JsonUtil :将json格式转化为某个类
StatefulHttpClient :访问http的客户端
MonitorMetrics:返回的是图中beans里的东西
HadoopUtil:获取Hadoop的一些属性以及打印出来
Hbase JMX监控实战
代码太多已打包上传到资源:https://download.csdn.net/download/bingdianone/10848206